package extend.db.base;

import extend.db.util.JavaTpye;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;

/**
 * sql 预处理解析
 *<B>说明：</B>
 *<pre>
 *  主要功能
 *  查找:name 类似标识替换成?
 *  给PreparedStatement 设值
 *</pre>
 *<B>示例：</B>
 *<pre>
 *  略
 *</pre>
 *<B>日志：</B>
 *<pre>
 *  略
 *</pre>
 *<B>注意事项：</B>
 *<pre>
 *  略
 *</pre>
 */
public class ParsedSql
{
    /**
     * 原始sql
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    private String originalSql;

    /**
     * 绑定参数
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    private Map<String,Object> bindParams = null;

    /**
     * java 类型与sql 数据类型的关系
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public int[] sqlTypes = null;

    /**
     * ? 对应参数
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public Object[] sqlParams = null;

    /**
     * 构造方法
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public ParsedSql(String rawSql,Map<String,Object> bindParams)
    {
        this.originalSql = rawSql;
        this.bindParams = bindParams;
        this.resolveSql();
    }

    /**
     * 构造方法
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public ParsedSql(Command command)
    {
        this.originalSql = command.getSql();
        this.bindParams = command.getParams();
        this.resolveSql();
    }

    /**
     * 解析sql
     *<B>说明：</B>
     *<pre>
     *  查找:name 关键词
     *  查找数据值类型
     *</pre>
     */
    private void resolveSql()
    {
        if (this.bindParams.isEmpty()) {
            return ;
        }

        // 定义位置信息
        int length = bindParams.size();
        this.sqlTypes = new int[length];
        this.sqlParams = new Object[length];

        // 计算器
        int i = 0;
        StringBuilder sql = new StringBuilder(this.originalSql);
        for (Map.Entry<String, Object> entry : this.bindParams.entrySet()) {
            String key = entry.getKey();
            // 查找字符串
            int keypos = sql.indexOf(key);
            if (keypos > -1) {
                sql.replace(keypos,keypos + key.length(),"?");
                // 找到位置
                this.sqlParams[i] = this.bindParams.get(key);
                this.sqlTypes[i] = JavaTpye.getSqlType(this.sqlParams[i]);
                i++;
            }
        }

        // 排序
        this.originalSql = sql.toString();
    }

    /**
     * 获取带? sql
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public String getSql()
    {
        return  this.originalSql;
    }

    /**
     * PreparedStatement ? 赋值
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     * @param stmt
     */
    public void parseSqlStatement(PreparedStatement stmt)
    {
        if (this.sqlParams == null) {
            return;
        }

        for (int i = 0; i < this.sqlParams.length;i++) {
            try {
                stmt.setObject((i + 1),this.sqlParams[i],this.sqlTypes[i]);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
